#pragma once

#include "MessageHeader.h"
#include "SignatureHelper.h"
#include "EncryptionHelper.h"
#include "RedisPool.h"
#include <string>
#include <memory>

using TraderEngine::RedisPool;

namespace MessageFramework {

/**
 * @brief 消息生产者（基于Redis Stream）
 *
 * 职责：
 * 1. 构建消息（填充Header字段）
 * 2. 签名消息（HMAC-SHA256）
 * 3. 加密消息（可选，AES-256-GCM）
 * 4. 发送到Redis Stream（XADD命令）
 *
 * 特性：
 * - 线程安全
 * - 自动填充时间戳、messageId等
 * - 支持同步发送和异步发送
 * - 支持点对点和广播模式
 */
class MessageProducer {
public:
    /**
     * @brief 配置选项
     */
    struct Config {
        std::string publisherId;        ///< 发布者ID（必填）
        std::string secretKey;          ///< 签名密钥
        std::string encryptionKey;      ///< 加密密钥（可选）
        bool autoSign = true;           ///< 自动签名
        bool autoEncrypt = false;       ///< 自动加密
        int maxStreamLength = 100000;   ///< Stream最大长度（MAXLEN）
    };

    /**
     * @brief 构造函数
     *
     * @param redisPool Redis连接池
     * @param config 配置
     */
    MessageProducer(RedisPool* redisPool, const Config& config);

    /**
     * @brief 简化构造函数
     */
    MessageProducer(RedisPool* redisPool, const std::string& publisherId);

    ~MessageProducer() = default;

    /**
     * @brief 发送消息（完整版）
     *
     * @param header 消息头（会自动填充部分字段）
     * @param body 消息体
     * @return 消息ID（Redis返回的Stream ID）或空字符串（失败）
     */
    std::string send(MessageHeader& header, const std::string& body);

    /**
     * @brief 发送消息（简化版）
     *
     * @param targetStream 目标Stream
     * @param messageType 消息类型
     * @param body 消息体
     * @param consumerId 消费者ID（可选，空表示广播）
     * @return 消息ID
     */
    std::string send(const std::string& targetStream,
                     const std::string& messageType,
                     const std::string& body,
                     const std::string& consumerId = "");

    /**
     * @brief 发送请求-响应消息
     *
     * @param targetStream 目标Stream
     * @param messageType 消息类型
     * @param body 消息体
     * @param replyStream 响应Stream名称
     * @param consumerId 消费者ID（可选）
     * @return 消息ID
     */
    std::string sendRequest(const std::string& targetStream,
                            const std::string& messageType,
                            const std::string& body,
                            const std::string& replyStream,
                            const std::string& consumerId = "");

    /**
     * @brief 设置追踪ID（用于分布式追踪）
     */
    void setTraceContext(const std::string& traceId, const std::string& parentId = "");

    /**
     * @brief 更新配置
     */
    void updateConfig(const Config& config);

private:
    RedisPool* m_redisPool;
    Config m_config;
    std::string m_currentTraceId;    ///< 当前追踪ID
    std::string m_currentParentId;   ///< 当前父消息ID

    /**
     * @brief 填充消息头的自动字段
     */
    void fillAutoFields(MessageHeader& header);

    /**
     * @brief 签名消息
     */
    void signMessage(MessageHeader& header, const std::string& body);

    /**
     * @brief 加密消息体
     */
    std::string encryptBody(const std::string& body);

    /**
     * @brief 发送到Redis Stream
     */
    std::string sendToRedis(const MessageHeader& header, const std::string& body);
};

using MessageProducerPtr = std::shared_ptr<MessageProducer>;

} // namespace MessageFramework
